/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.ufpr.inf.escel.brain.operators;

import br.ufpr.inf.escel.brain.model.DadoTeste;
import br.ufpr.inf.escel.brain.model.pp.DadoTestePP;
import br.ufpr.inf.escel.brain.operators.util.CruzamentoUtils;
import br.ufpr.inf.escel.brain.util.StringUtils;

/**
 * Classe base para a criação dos operadores genéticos para programas
 * procedurais. Essa classe não deverá mais ser herdada ou modificada.
 *
 * Antes da refatoração: 160 linhas
 * depois:
 * @author gustavo
 */
public final class OperadoresPP extends Operadores {

    /**
     * Novo metodo para cruzamento. Ele pega cada elemento e
     * realiza uma codificação específica. Para os númericos
     * (inteiro, float e double) ele soma ou diminui, de acordo
     * com a sorte. No caso da String, ele concatena as duas,
     * eliminando os caracteres repetido @see StringUltis#merge(String, String).
     * Para um caracter, um novo elemento é gerado
     *
     * @param dt1 primeiro dado de teste
     * @param dt2 segundo dado de teste
     * @return dado de teste resultante da combinação entre dt1 e dt2
     * @since 2.1
     */
    public DadoTeste cruzar(DadoTeste dt1, DadoTeste dt2) {
        DadoTestePP paiDT = (DadoTestePP) dt1;
        DadoTestePP maeDT = (DadoTestePP) dt2;

        String pai, mae, cruzado;

        if (paiDT.getDado().equals("") && maeDT.getDado().equals("")) {
            pai = paiDT.getParametro();
            mae = maeDT.getParametro();
        } else {
            pai = paiDT.getDado();
            mae = maeDT.getDado();
        }

        cruzado = CruzamentoUtils.merge(pai, mae);

        DadoTestePP filho = (DadoTestePP) paiDT.copy();
        filho.setDado(cruzado);
        filho.setParametro("");

        return filho;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public DadoTeste mutar(DadoTeste dt) {
        DadoTestePP dtPP = (DadoTestePP) dt;

        String mutado = StringUtils.compress();

        dtPP.setDado(mutado);
        dtPP.setParametro("");
        return dtPP;
    }
}
